package xxxx.com.service;

import xxxx.com.model.User;
import xxxx.com.model.UserFocus;
import xxxx.com.model.UserInfo;

import java.util.List;
import java.util.Map;

/**
 * 处理用户业务逻辑的接口
 * @author dullwolf
 */
public interface UserService {

    /**
     * 通过用户名查找用户
     * @param username 用户名
     * @return 返回User对象
     */
    User findUserByName(String username);

    /**
     * 通过用户名获取用户基本信息
     * @param username 用户名
     * @return User对象（其中密码，地址设置为null）
     */
    User findUserBaseInfo(String username);


    /**
     * 添加用户信息到注册表（User表）和用户表（User_Info表）
     * @param name 用户名，pwd 密码，email 邮箱地址
     * @return
     */
    void addUser(String name,String pwd,String email);

    /**
     * 通过邮箱查找用户
     * @param email 用户邮箱
     * @return 返回User对象
     */
    User findUserByEmail(String email);

    /**
     * 重置密码，通过id更改对应用户的登录密码（User表）
     * @param id
     * @param password
     */
    void resetPwd(Integer id, String password);

    /**
     * 当用户再次登录时，更新用户的登录时间（User_Info表）
     * @param id
     */
    void updateLoginTime(Integer id);

    /**
     * 通过用户id查询：user.id，user.username,user.id_dept,user.is_secret,user_info.pic,dept.name
     * 封装成Map存入前端Session
     * @param id
     * @return Map集合
     */
    Map<String,Object> findUserById(Integer id);

    /**
     * 通过用户id查询：（user_info表）用户ID，用户真实姓名，性别，年龄，电话，所在部门名称，注册时间，登陆时间
     *             （user表）部门ID，是否私密
     *             （user_focus表）follows该用户被关注的次数
     * @param id
     * @return
     */
    Map<String,Object> findUserDetail(Integer id);

    /**
     * 修改用户头像图片的地址
     * @param id 用户id
     * @param picPath 图片的新路径
     */
    void updatePic(Integer id,String picPath);

    /**
     * 修改用户的私密选项和部门编号
     * @param user
     */
    void updateSecret(User user);

    /**
     * 把user_look页面的用户信息保存到user_info数据库表
     * 数据包括：真实姓名，年龄，性别，电话号码
     * @param userInfo
     */
    void updateUserInfo(UserInfo userInfo);

    /**
     * 查找用户列表，包括id，姓名（真实姓名和注册名），性别，年龄，简介，关注的用户
     * @param uId
     * @param search
     * @param page
     * @return
     */
    List<Map<String, Object>> findUserList(Integer uId, String search, int page);

    /**
     * 查询用户的总数
     * @return
     */
    long getTotalCount(String search);

    /**
     * 当用户被查看详细信息时，该用户的被查看次数+1
     * @param id 用户id
     * @param times 次数
     */
    void lookCount(Integer id, Integer times);

    /**
     * 查询user_focus表中是否已存在关注关系
     * @param uId 用户id
     * @param ufId 关注用户id
     * @return
     */
    UserFocus findFocusBean(Integer uId, Integer ufId);

    /**
     * 添加关注
     * @param userId 用户ID
     * @param ufId   被关注的用户ID
     */
    void addFocus(Integer userId, Integer ufId);

    /**
     * 删除关注
     * @param userId 用户ID
     * @param ufId   被关注的用户ID
     */
    void removeFocus(Integer userId, Integer ufId);

    /**
     * 查找用户关注的人
     *
     * @param userId 用户ID
     * @param page 页数
     * @return
     */
    List<Map<String, Object>> findFocusList(Integer userId, Integer page);

    /**
     * 查找用户关注用户的总数
     * @param userId
     * @return
     */
    long getFocusTotalCount(Integer userId);

    /**
     * 获取各部门的人数
     * @return
     */
    List<Map<String,Object>> getUserCount();

    /**
     * 查找全体员工以及各自的部门，包括：用户ID，用户名（真实名字和注册名字），部门ID，部门名称
     * @return
     */
    List<Map<String, Object>> findUserDeptList();
}
